#ifndef _TASK_FRAMEWORK_H
#define _TASK_FRAMEWORK_H

#include "stm8s.h"

// 任务状态枚举（RAM中）
typedef enum {
    TASK_IDLE,       // 空闲
    TASK_READY,      // 就绪
    TASK_RUNNING     // 运行中
} TaskState;

// 任务只读信息结构体（存储在Flash）
typedef struct {
    const char* name;       // 任务名（Flash）
    void (*init)(void);
    void (*func)(void);     // 任务回调函数（Flash）
} TaskConstInfo;

// 任务运行时结构体（存储在RAM）
typedef struct {
     TaskConstInfo  info;  // 指向Flash中的只读信息
    uint16_t last_run;      // 上次运行时间（RAM）
    uint16_t period;        // 周期（10ms为单位，0表示仅触发）（RAM，可动态修改）
    TaskState state;        // 任务状态（RAM）
    uint8_t trig_flag;      // 触发标志（RAM）
} TaskTypeDef;

// 任务导出宏：只读信息放Flash，运行时数据（含周期）放RAM的.task_section段
#define TASK_DEF(task_name, init_func,task_func, init_period) { \
        .info = { \
        .name = #task_name, \
        .func = task_func, \
        .init=init_func\
         }, \
        .last_run = 0, \
        .period = init_period,   \
        .state = TASK_IDLE,  \
        .trig_flag = 0 },

// 外部声明任务段边界（由链接脚本定义）
extern TaskTypeDef* _task_start;
extern TaskTypeDef* _task_end;

// 函数声明
void sys_task_init(void);
void sys_task_scheduler(void);
uint8_t sys_task_trigger_by_name(const char* task_name);
void sys_task_trigger(TaskTypeDef* task);
void sys_task_set_period(TaskTypeDef* task, uint16_t new_period);  // 新增：设置任务周期

#endif
